package com.crazy.crazyproductservice.service.impl;

import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.crazy.crazycommon.common.ErrorCode;
import com.crazy.crazycommon.exception.BusinessException;
import com.crazy.crazymodel.model.entity.Product;
import com.crazy.crazymodel.model.vo.ProductAddVO;
import com.crazy.crazymodel.model.vo.ProductGetVO;
import com.crazy.crazymodel.model.vo.ProductUpdateVO;
import com.crazy.crazymodel.model.vo.ProductVO;
import com.crazy.crazyproductservice.mapper.ProductMapper;
import com.crazy.crazyproductservice.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * ProductServiceImpl
 *
 * @author 13259
 * @version 2024/05/07 19:19
 **/
@Service
@Slf4j
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {

    @Resource
    private ProductMapper productMapper;
    @Override
    public ProductGetVO productGet(int productCurrent, String productName, String productType,String productState, HttpServletRequest request) {
        // 创建一个 QueryWrapper 对象，设置查询条件
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();


        // 构建模糊查询的关键字
        queryWrapper.like("productName", "%" + productName + "%");
        queryWrapper.like("productType", "%" + productType + "%");

        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        ZoneId zoneId = ZoneId.systemDefault();

        if(!Objects.equals(productState, "")) {
            // 构建日期查询条件
            queryWrapper.and(wrapper -> wrapper.isNull("finishTime").or().ge("finishTime", currentDate));
        }
        // 执行数据库查询，获取满足条件的用户列表
        List<Product> productList=this.getBaseMapper().selectList(queryWrapper);

        if(productList.isEmpty()) {
            log.info("未找到符合的产品！");
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "未找到符合的产品");
        }

        // 根据页码选择返回的产品列表（暂定一页十条记录）
        int pageSize = 10;
        //页码超出则将页码改为合理值
        if(productCurrent*pageSize>productList.size()){
            productCurrent=productList.size()/pageSize+1;
        }
        int startIndex = (productCurrent - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, productList.size());
        List<Product> products = productList.subList(startIndex, endIndex);

        ProductGetVO productGetVO = new ProductGetVO();
        ProductGetVO.ProductData productData = new ProductGetVO.ProductData();

        // 设置当前页码
        productData.setCurrent(productCurrent);
        // 设置每页显示的产品数量
        productData.setSize(pageSize);
        // 设置查询出的产品总数
        productData.setTotal(productList.size());

        List<ProductVO> productVOList = new ArrayList<>();

        // 根据页码和每页显示数量计算需要返回的产品列表
        for (Product product : products) {
            ProductVO productVO = new ProductVO();
            productVO.setId(product.getProductID());
            productVO.setCode(product.getProductCode());
            productVO.setName(product.getProductName());
            productVO.setType(product.getProductType());
            productVO.setRisk(product.getRiskLevel());
            // 将产品的完成日期转换为LocalDate
            if(product.getFinishTime()!=null) {
                LocalDate finishDate = product.getFinishTime().toInstant().atZone(zoneId).toLocalDate();
                if (currentDate.isAfter(finishDate)) {
                    productVO.setState("封闭");
                } else {
                    productVO.setState("开放");
                }
            }else {
                productVO.setState("开放");
            }
            productVOList.add(productVO);
        }

        // 设置产品列表
        productData.setProduct(productVOList);
        // 设置响应代码
        productGetVO.setMsg(200);
        // 设置数据
        productGetVO.setData(productData);

        return productGetVO;
    }

    @Override
    public ProductAddVO productAdd(String productCode, String productName, String productType, int productRisk,Date finishTime , HttpServletRequest request){

        // 构造产品对象
        Product product = new Product();
        product.setProductCode(productCode);
        product.setProductName(productName);
        product.setProductType(productType);
        product.setRiskLevel(productRisk);
        product.setFinishTime(finishTime);

        // 插入产品到数据库,同时判断是否更新成功
        if(this.getBaseMapper().insert(product)==0){
            // 构造ProductAddVO对象
            ProductAddVO productAddVO = new ProductAddVO();
            productAddVO.setMsg(500);
            productAddVO.setData(null);

            return productAddVO;
        }else {
            // 构造ProductAddVO对象
            ProductAddVO productAddVO = new ProductAddVO();
            productAddVO.setMsg(200);
            productAddVO.setData(null);

            return productAddVO;
        }
    }

    @Override
    public ProductUpdateVO productUpdate(int productId, String productCode, String productName, String productType, int productRisk, Date finishTime, HttpServletRequest request){
        // 根据productId获取需要更新的产品信息
        Product product = this.getBaseMapper().selectById(productId);
        if(product==null) {
            log.info("未找到符合的产品！");
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "未找到符合的产品");
        }

        // 更新产品信息
        product.setProductCode(productCode);
        product.setProductName(productName);
        product.setProductType(productType);
        product.setRiskLevel(productRisk);
        product.setFinishTime(finishTime);

        // 更新产品信息到数据库,同时判断是否更新成功
        if(this.getBaseMapper().updateById(product)==0){
            // 构造ProductUpdateVO对象
            ProductUpdateVO productUpdateVO = new ProductUpdateVO();
            productUpdateVO.setMsg(500);
            productUpdateVO.setData(null);

            return productUpdateVO;
        }else {
            // 构造ProductUpdateVO对象
            ProductUpdateVO productUpdateVO = new ProductUpdateVO();
            productUpdateVO.setMsg(200);
            productUpdateVO.setData(null);

            return productUpdateVO;
        }
    }

    @Override
    public Product getById(int productID) {
        return this.getBaseMapper().selectById(productID);
    }


    @Override
    public Product getByCode(String productCode) {
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("productCode",productCode);
        Product product = productMapper.selectOne(queryWrapper);
        return product;
    }
}
